动画树
功能概述
在上一节,大家应该已经感受到了动画播放器(AnimationPlayer)功能的强大与灵活,可以做出十分出色的动画效果,它可以在任何节点或资源中对任何属性进行动画处理,以及专门的变换、贝塞尔、函数调用、音频和子动画轨道,是一份十分强大且独特的能力。
然而动画播放器(AnimationPlayer)依旧有着不足,通过其混合这些动画的支持相对有限,只能设置固定的交叉渐变过渡时间。
动画树(AnimationTree)是IdeaXR所引入的一种全新节点,它可以用于处理更多更高级的变换,能够弥补动画播放器(AnimationPlayer)的诸多不足,有着大量的功能和灵活性。
创建一个动画树(AnimationTree)
我们可以通过新建Node的方式新建一个动画树
首先, 必须明确动画树(AnimationTree)节点不包含它自己的动画. 相反, 它使用包含在动画树(AnimationTree)节点中的动画. 通过这种形式, 您可以像往常一样编辑动画(或从3D场景导入动画), 然后使用这个额外节点来控制播放.
在3D场景中经常使用动画树(AnimationTree) . 当从3D交换格式导入场景时, 它们通常自带动画(要么是多个, 要么是在导入时从一个大的动画中拆分出来). 最后, 导入的IdeaXR场景在动画树(AnimationTree) 节点中包含动画.
在IdeaXR中我们很少直接使用导入的场景(它们要么来自实例化, 要么来自继承), 您可以将动画树(AnimationTree) 节点放置在包含导入的新场景中. 然后, 将动画树(AnimationTree)节点指向导入场景内创建的动画树(AnimationTree) 节点.
这是在多人协同合作项目中的设置,参考下图:
我们可以在动画树(AnimationTree) 中使用三种主要节点类型:
- 动画节点, 从链接的动画树(AnimationTree) 中引用动画.
- 动画根节点, 用于融合子节点.
- 动画融合节点,在
AnimationNodeBlendTree
中使用,通过多个输入端口进行单图混合。
动画融合的不同类型
在动画树(AnimationTree) 中设置根节点, 如下几种类型可供选择:
AnimationNodeAnimation
:从列表中选择一个动画并播放它. 这是最简单的根节点, 一般不直接用作根节点.AnimationNodeBlendTree
:包含许多融合类型的节点,如调配, 融合2, 融合3, 一对一等. 这是最常用的根节点之一.AnimationNodeStateMachine
:将多个根节点作为图中的子节点. 每个节点作为一个状态使用, 并提供多个函数在状态之间进行切换.AnimationNodeBlendSpace2D
:允许在二维混合空间中放置根节点. 在二维中控制融合位置以融合多个动画.AnimationNodeBlendSpace1D
:以上的简化版本(一维)。AnimationRootNode
:动画的根节点,通常用于融合子节点。
简单融合
AnimationNodeAnimation
我们可以使用 AnimationNodeAnimation
来对单一动画进行指定与控制
这是最简单的一种动画树根节点,因为其功能较少,我们一般很少直接将其作为根节点。
AnimationRootNode
AnimationRootNode
主要用来作为动画的根节点,通常的作用是用来融合子节点,相当于决定了之后的选项锁定什么位置,可以用来明确指定对应骨骼。
AnimationNodeBlendSpace2D
AnimationNodeBlendSpace2D
是一个在二维空间进行高级融合的节点. 将点添加到一个二维空间, 然后可以控制位置来确定融合:
可以创建多个点,对每个点设置动画:
可以控制X和Y的范围(为方便起见, 还可以标记它们). 默认情况下, 可以在任何位置放置点(只需右键单击坐标系统或使用 添加点 按钮)将自动生成德洛内三角形.
当然也可以通过禁用 自动三角形 选项来手动绘制三角形, 虽然基本上没必要这么做
最后, 可能会更改融合模式. 默认情况下, 融合是通过在最近的三角形内插点来实现的. 当处理二维动画(逐帧)时, 您可能希望切换到 离散 模式. 此外, 如果您想在离散动画之间切换时保持当前播放位置, 请使用 进位 模式. 此模式可在 混合 菜单中更改:
AnimationNodeBlendSpace1D
这类似于二维混合空间, 但在一维空间中(所以不需要三角形).
动画状态机节点(AnimationNodeStateMachine)
这个节点是个相对简单的状态机. 根节点可以创建并通过线路连接. 状态通过 转换 连接, 它们是具有特殊性质的连接. 转换是单向的, 但是可以用两种方式连接.
有多种类型的转换:
- 即刻: 将立即切换到下一个状态. 当前状态将结束, 并融合到新状态的开始.
- 同步: 立即切换到下一个状态, 但会将新状态搜索并放置到旧状态的回放位置.
- 在终点: 将等待当前状态回放结束, 然后切换到下一个状态的开始动画.
过渡也有一些属性。单击任何过渡,它就会显示在“检查器”面板中:
- 切换模式 为过渡类型(见上文), 可以在此处创建后修改.
- 自动前进 当达到此状态时将自动开启转换. 最适合 "末尾" 切换模式.
- 前进条件 设置此条件后, 将打开自动前进. 这是一个可以用变量名填充的自定义文本字段. 可以从代码中修改变量(稍后将对此进行详细介绍).
- X消隐时间 是在这个状态和下一个状态之间交替渐变的时间.
- 优先级 与代码中的
travel()
函数一起使用. 当从一个状态到另一个状态时, 当给这个节点更多的优先权. - 禁用 允许禁用此转换(它不会在行程或自动前进期间使用).
动画融合树节点(AnimationNodeBlendTree)
AnimationNodeBlendTree
可包含用于融合的根节点和常规节点。节点从菜单添加到图中:
所有融合树默认都包含一个 Output
(输出)节点,为了让动画播放,必须有个东西与其相连。
测试此功能最简单的方法是直接连接一个 Animation
(动画)节点:
这会简单地回放动画. 确保动画树(AnimationTree)节点对实际发生的事情是激活的.
融合 blend(blend2/blend3)
这些节点将通过用户指定输入的两个或三个融合值之间进行融合,以此来进行多种动画的组合播放,下面的例子可以让你比较直观的了解到其用途
对于一些更加复杂的融合,推荐使用融合空间
融合也可以使用过滤器, 也就是说, 您可以单独控制通过融合功能的轨道. 这非常有利于动画的重叠
OneShot
此节点用于执行子动画,并在完成后返回,可用于定制淡入淡出时间、以及过滤器.
在激活启用后会立刻执行一次,然后返回。
查找 seek
这个节点可以用来使寻找命令发生在动画图像的任何子代上。使用这个节点类型可以从动画融合树中的开始或某个位置播放动画
时间缩放 TimeScale
允许缩放任何子节点的动画速度(或将其反转). 设置为0会暂停动画.通过调整其数值,可以是一个动画变为多倍速或几倍慢动作。
转换 Transition
非常简单的状态机(当您不想使用 StateMachine节点时)。动画可以连接到输出,并且可以指定过渡时间。
二维融合空间与一维融合空间 BlendSpace2D/BlendSpace1D
与 AnimationNodeBlendSpace2D
和 AnimationNodeBlendSpace1D
用法相同,具体使用方法可以参考之前关于这两个根节点的介绍,我们可以在融合树中将这个两个节点融合到动画当中。
状态机 StateMachine
我们也可以在融合树内使用状态机,具体使用方式可以参考 AnimationNodeStateMachine
中的介绍。